package com.zjl.springmvc.controller.xxxMapping;

import com.zjl.springmvc.bean.User;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@RestController
//@Controller//只用这个注解的时候   可以直接跳转页面  但是不能返回信息
public class 获取请求参数Controller {
    /**
     * SpringMVC目标方法能写多少种参数类型。取决于"参数解析器"有多少个
     * @PathVariable("id")  可以拿到；路径变量的值
     * @RequestHeader //获取所有请求头   ("User-Agent")  //指定   请求头
     * @CookieValue("_ga") Cookie cookie//获取_ga的Cookie//没有Cookie会报错
     * @RequestBody //获取请求体数据!
     * @RequestParam //或其指定的请求参数  ?后面的
     * 都可以设置参数
     * (value = "指定值",required = false,defaultValue = "屎山")
     * value: 对应的时指定key
     * required:默认true  必须有此key 否则报错
     *          false     可无此key
     * defaultValue  默认值。当无此参数或值为空的时候  给个默认
     *               有默认值 required  就没必要了  因为必定有此key
     *
     * 四大参数处理原理中：
     * RequestMappingHandlerAdapter
     *
     *   HandlerMethodArgumentResolver//参数解析器  学习的时候26种
     *      XxxMethodArgumentResolver//Xxx就像@PathVariable这样的
     *      确定将要执行的目标方法的每一个参数的值是什么;
     *      SpringMVC目标方法能写多少种参数类型。取决于参数解析器
     *   返回值处理器  约15种 XxxMethodReturnValueHandler
     *
     */
    @GetMapping("/car/{id}/owner/{username}")//
    public Map<String,Object> getCar(@PathVariable("id") Integer id,//达到指定的路径变量的值
                                     @PathVariable("username") String username,
                                     @PathVariable Map<String,String> pv,//获取所有路径的变量信息
                                     @RequestHeader("User-Agent") String userAgent,//获得指定请求头
                                     @RequestHeader Map<String,String> header,//获取所有请求头
                                     @RequestParam("age") Integer age,//？后面的
                                     @RequestParam("inters") List<String> inters,
//                                     @CookieValue(value = "_ga") String ga,//找相关Cook的值
//                                     @CookieValue("_ga") Cookie cookie,
                                     @RequestParam Map<String,String> params

    ){

        Map<String,Object> map=new HashMap<>();
        map.put("id",id);
        map.put("username",username);
        map.put("pv",pv);
        map.put("userAgent",userAgent);//获得指定请求头
        map.put("header",header);//获取所有请求头
        map.put("age",age);
        map.put("inters",inters);
        map.put("params",params);
//        map.put("_ga",ga);
//        System.out.println(cookie);
        return map;

    }

    @RequestMapping("/testServletAPI")
    //现在不用 HttpServletRequest 有更好的
    public String testServletAPI(HttpServletRequest request){
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        System.out.println(username+password);
        return "target";

    }

    @PostMapping("/save")//获取请求体数据
    public Map postMethod(@RequestBody String content){
        Map<String,Object> map=new HashMap<>();
        map.put("content",content);
        return map;
    }//详见 index.html的  <form action="/save"
    @PostMapping("/requestParam")//获取请求体数据
    public Map requestParam(
            //           指定 参数名字    默认true 必须有此参数  false 可以不写  defaultValue 默认值 不写或传参为空
            @RequestParam(value = "user",required = true,defaultValue = "屎山") String content){
        Map<String,Object> map=new HashMap<>();
        map.put("user",content);
        return map;
    }//详见 index.html的  <form action="/save"

    @PostMapping("/UserDemo")//获取请求体数据
    public User UserDemo(User user){
        /**
         * 自定义类型参数 封装POJO
         * ServletModelAttributeMethodProcessor  这个参数处理器支持
         *  是否为简单类型。
         *
         *  @FunctionalInterfacepublic interface Converter<S, T>
         *      converter那个可以将这个数据类型（request带来参数的字符串）
         *      转换到指定的类型（JavaBean -- Integer）
         */
        System.out.println(user);
        return user;
    }
}
